package com.kobe.game_40;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 
 * A perfect number is a number for which the sum of its proper divisors is
 * exactly equal to the number. For example, the sum of the proper divisors of
 * 28 would be 1 + 2 + 4 + 7 + 14 = 28, which means that 28 is a perfect number.
 * 
 * A number n is called deficient if the sum of its proper divisors is less than
 * n and it is called abundant if this sum exceeds n.
 * 
 * As 12 is the smallest abundant number, 1 + 2 + 3 + 4 + 6 = 16, the smallest
 * number that can be written as the sum of two abundant numbers is 24. By
 * mathematical analysis, it can be shown that all integers greater than 28123
 * can be written as the sum of two abundant numbers. However, this upper limit
 * cannot be reduced any further by analysis even though it is known that the
 * greatest number that cannot be expressed as the sum of two abundant numbers
 * is less than this limit.
 * 
 * Find the sum of all the positive integers which cannot be written as the sum
 * of two abundant numbers.
 * 
 * 
 */
public class Game23 {
    public static void main(String[] args) {
        Map<Integer, Integer> twoAbundantSumMap = new HashMap<Integer, Integer>();
        int a = 0;
        List<Integer> abundantResultList = new ArrayList<Integer>();
        List<Integer> abundantNumberList = new ArrayList<Integer>();
        for (int i = 2; i < 28123; i++) {
            if ((a = getAbundantNumber(i)) != 0) {
                abundantNumberList.add(i);
                abundantResultList.add(a);
            }
        }
        int sum = 0;
        for (int i = 0; i < abundantNumberList.size(); i++) {
            for (int j = i; j < abundantNumberList.size(); j++) {
                sum = abundantNumberList.get(i) + abundantNumberList.get(j);
                twoAbundantSumMap.put(sum, sum);
            }
        }
        long result = 0L;
        for (int i = 0; i <= 28123; i++) {
            if (!twoAbundantSumMap.containsKey(i)) {
                result += i;
            }
        }
        System.out.println(result);
    }

    public static int getAbundantNumber(int number) {
        int result = 1;
        for (int i = 2; i <= number / 2; i++) {
            if (number % i == 0) {
                result += number / i;
            }
        }
        return result > number ? result : 0;
    }
}
